//
//  TuyaDevice.m
//  Tuya
//
//  Created by Jarvis on 2022/5/18.
//

#import "TuyaDevice.h"
#import <TuyaSmartHomeKit/TuyaSmartKit.h>
#import "MJExtension.h"



/// 单利对象
static TuyaDevice *_instance = nil;


@interface TuyaDevice () <TuyaSmartBLEManagerDelegate, TuyaSmartActivatorDelegate>
/// 蓝牙启用状态回调
@property (nonatomic, copy) FlutterResult bluetoothStatusResult;
/// 蓝牙开始扫描
@property (nonatomic, copy) FlutterResult startListeningResult;
/// 配网回调
@property (nonatomic, copy) FlutterResult configNetResult;
@end

@implementation TuyaDevice

/// 单利对象
+ (instancetype)internal {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _instance  = [[TuyaDevice alloc] init];
    });
    return _instance;
}

/**
 * 移除设备
 */
+ (void)removeWithDeviceId:(NSString *)deviceId result:(FlutterResult)result {
    [[TuyaSmartDevice deviceWithDeviceId:deviceId] remove:^{
        NSLog(@"remove success");
        result(@"1");
    } failure:^(NSError *error) {
        NSLog(@"remove failure: %@", error);
        result(@"0");
    }];;
}

/**
 * 恢复出厂设置
 */
+ (void)resetFactoryWithDeviceId:(NSString *)deviceId result:(FlutterResult)result {
    [[TuyaSmartDevice deviceWithDeviceId:deviceId] resetFactory:^{
        NSLog(@"reset success");
        result(@"1");
    } failure:^(NSError *error) {
        NSLog(@"reset failure: %@", error);
        result(@"0");
    }];;
}

/**
 * 获取配网令牌
 *
 * @param result    回调方法 token
 */
+ (void)getTokenWithHomeId:(long long)homeId result:(FlutterResult)result {
    // 获取 配网 Token
    [[TuyaSmartActivator sharedInstance] getTokenWithHomeId:homeId success:^(NSString *token) {
        NSLog(@"getToken success: %@", token);
        result(token);
    } failure:^(NSError *error) {
        NSLog(@"getToken failure: %@", error.localizedDescription);
        result(nil);
    }];
}

/**
 * 二维码配网token
 */
+ (void)getTokenWithUUID:(NSString *)uuid homeId:(long long)homeId  result:(FlutterResult)result {
    [[TuyaSmartActivator sharedInstance] getTokenWithUUID:uuid homeId:homeId success:^(NSString *token) {
        // 获取token
        NSLog(@"getUUIDToken success: %@", token);
        result(token);
    } failure:^(NSError *error) {
        NSLog(@"getUUIDToken failure: %@", error.localizedDescription);
        result(nil);
    }];
}

/**
 *  开始配网
 */
+ (void)startConfigMode:(NSUInteger)mode WiFi:(NSString *)ssid password:(NSString *)password token:(NSString *)token result:(FlutterResult)result {
    /// 设置回调
    [TuyaDevice internal].configNetResult = result;
    // 设置 TuyaSmartActivator 的 delegate，并实现 delegate 方法
    [TuyaSmartActivator sharedInstance].delegate = [TuyaDevice internal];
    // 开始配网，快连模式对应 mode 为 TYActivatorModeEZ
    [[TuyaSmartActivator sharedInstance] startConfigWiFi:mode ssid:ssid password:password token:token timeout:2000];
}

/**
 * 启动二维码配置网络
 *
 * @param uuid              设备 ID
 * @param homeId        设备将要绑定到的家庭的 ID
 * @param ssid             Wi-Fi 名称
 * @param password    Wi-Fi 密码
 */
+ (void)startQRCodeConfigNetWithUUID:(NSString *)uuid homeId:(long long)homeId ssid:(NSString *)ssid password:(NSString *)password result:(FlutterResult)result {
    
    /// 设置回调
    [TuyaDevice internal].configNetResult = result;
    
    /// 设置 TuyaSmartActivator 的 delegate，并实现 delegate 方法
    TuyaSmartActivator *instance = [TuyaSmartActivator sharedInstance];
    instance.delegate = [TuyaDevice internal];
    
    /// 获取token
    [[TuyaSmartActivator sharedInstance] getTokenWithUUID:uuid homeId:homeId success:^(NSString *token) {
        // 获取token
        NSLog(@"getUUIDToken success: %@", token);
        result(token);
        // // 开始配网，快连模式对应 mode 为 TYActivatorModeEZ// TYActivatorModeQRCode
        [instance startConfigWiFi:TYActivatorModeEZ ssid:ssid password:password token:token timeout:2000];
    } failure:^(NSError *error) {
        NSLog(@"getUUIDToken failure: %@", error.localizedDescription);
        result(@"0");
    }];
}

/**
 * 停止配网
 */
+ (void)stopConfigNet:(FlutterResult)result  {
    [TuyaSmartActivator sharedInstance].delegate = nil;
    [[TuyaSmartActivator sharedInstance] stopConfigWiFi];
    result(@"1");
}

/**
 * 获取蓝牙启用状态
 *
 * @param result  回调函数，蓝牙状态，开启 1 或 关闭 0
 */
+ (void)getBluetoothEnabledStatus:(FlutterResult)result {
    // 添加回调
    [TuyaDevice internal].bluetoothStatusResult = result;
    // 设置代理
    [TuyaSmartBLEManager sharedInstance].delegate = [TuyaDevice internal];
}

// 开始扫描
+ (void)startListening:(FlutterResult)result {
    // 添加回调
    [TuyaDevice internal].startListeningResult = result;
    // 设置代理
    [TuyaSmartBLEManager sharedInstance].delegate = [TuyaDevice internal];;
    // 开始扫描
    [[TuyaSmartBLEManager sharedInstance] startListening:YES];
}

// 停止扫描
+ (void)stopListening:(FlutterResult)result {
    // 清除回调
    [TuyaDevice internal].startListeningResult = nil;
    // 停止扫描
    [[TuyaSmartBLEManager sharedInstance] stopListening:YES];
    // 回调
    result(@"1");
}

/**
 * 蓝牙单点配网
 * 
 * @param params    设备信息 Model，来源于扫描代理方法返回的结果
 *              uuid                NSString    设备 UUID，可以唯一区别设备
 *              productId       NSString    产品 ID
 *              mac                NSString    设备 Mac，不可作为唯一码，iOS 为空
 *              isActive          Bool    是否被绑定，能回调的均为未配网的设备
 *              isSupport5G         Bool    表示蓝牙 LE 设备是否支持通过路由器在5GHz频段上的连接
 *              isProuductKey      Bool    是否支持 productKey
 *              bleProtocolV        int    设备支持的涂鸦蓝牙协议版本
 *              bleType                 Enum    设备类型，用于区分不同协议的设备（取值范围 1 ~ 11）
 * @param homeId    当前家庭 ID
 */
+ (void)activeBLE:(NSDictionary *)params homeId:(long long)homeId result:(FlutterResult)result {
    TYBLEAdvModel *model = [TYBLEAdvModel mj_objectWithKeyValues:params];
    [[TuyaSmartBLEManager sharedInstance] activeBLE:model homeId:homeId success:^(TuyaSmartDeviceModel *deviceModel) {
        // 激活成功
        NSLog(@"激活成功");
        result([deviceModel mj_JSONString].mj_JSONString);
    } failure:^{
        // 激活中的错误
        NSLog(@"激活失败！");
        result(nil);
    }];
}

/**
 * 双模设备配网
 *
 * 接口说明
 *    扫描到未激活的设备后，可以使用该方法将配网信息通过蓝牙通道下发给设备，并等待配网结果回调。
 *
 * 参数说明
 * @param uuid    设备 uuid
 * @param homeId    当前家庭 ID
 * @param productId    产品 ID
 * @param ssid    Wi-Fi 路由器热点名称
 * @param password    Wi-Fi 路由器热点密码
 * @param timeout    轮询时间
 */
+ (void)startConfigBLEWifiDeviceWithUUID:(NSString *)uuid
                                  homeId:(long long)homeId
                               productId:(NSString *)productId
                                    ssid:(NSString *)ssid
                                password:(NSString *)password
                                 timeout:(NSTimeInterval)timeout  result:(FlutterResult)result {
    [[TuyaSmartBLEWifiActivator sharedInstance] startConfigBLEWifiDeviceWithUUID:uuid homeId:homeId productId:productId ssid:ssid password:password  timeout:100 success:^{
        // 下发成功
        NSLog(@"下发成功");
        result(@"1");
    } failure:^{
        // 下发失败
        NSLog(@"下发失败");
        result(@"0");
    }];
}

/**
 *  关闭轮询
 */
+ (void)stopDiscover {
    //在配网结束后调用
    [[TuyaSmartBLEWifiActivator sharedInstance] stopDiscover];
}


/**
 * 连接离线中的设备
 * 接口说明
 *    若设备处于离线状态，可以调用连接方法进行设备连接。
 *
 * @param uuid    设备 UUID
 * @param productKey    产品 ID
 * @param result 回调 成功 true 或失败 false
 */
+ (void)connectBLEWithUUID:(NSString *)uuid productKey:(NSString *)productKey result:(FlutterResult)result {
    [[TuyaSmartBLEManager sharedInstance] connectBLEWithUUID:uuid productKey:productKey success:^{
        NSLog(@"链接成功");
        result(@"1");
    } failure:^{
        NSLog(@"链接失败");
        result(@"0");
    }];
}

/**
 * 断开已连接的设备
 * 接口说明
 *    若设备处于连接状态 可以调用该方法断开与设备连接。
 *
 * @param uuid    设备 UUID
 * @param result 回调 成功 true 或失败 false
 */
- (void)disconnectBLEWithUUID:(NSString *)uuid result:(FlutterResult)result {
    [[TuyaSmartBLEManager sharedInstance] disconnectBLEWithUUID:uuid success:^{
        NSLog(@"断开链接成功");
        result(@"1");
    } failure:^(NSError *error) {
        NSLog(@"断开链接失败");
        result(@"0");
    }];
}



#pragma mark --- TuyaSmartBLEManagerDelegate


/**
 * 监测手机蓝牙状态
 *
 * 接口说明
 *    在用户手机的蓝牙发生状态变化时，如开启或关闭，可以通过设置代理收到具体的消息。
 *
 * @param isPoweredOn 蓝牙状态，开启或关闭
 *
 */
- (void)bluetoothDidUpdateState:(BOOL)isPoweredOn {
    NSLog(@"蓝牙状态变化: %@", isPoweredOn ? @"true" : @"false");
    // 蓝牙状态变化回调
    [TuyaDevice internal].bluetoothStatusResult(isPoweredOn ? @"1" : @"0");
}

    
/**
 * 扫描到未激活的设备
 *
 * @param deviceInfo 未激活设备信息 Model
 */
- (void)didDiscoveryDeviceWithDeviceInfo:(TYBLEAdvModel *)deviceInfo {
    // 成功扫描到未激活的设备
    // 若设备已激活，则不会走此回调，且会自动进行激活连接
    [TuyaDevice internal].startListeningResult(deviceInfo.mj_JSONString);
}


#pragma mark - TuyaSmartActivatorDelegate
/// 分销状态更新的回调，wifi单产品，zigbee网关，zigbee子设备。
/// @param activator instance
/// @param deviceModel deviceModel
/// @param error error
- (void)activator:(TuyaSmartActivator *)activator didReceiveDevice:(TuyaSmartDeviceModel *)deviceModel error:(NSError *)error {
    if (!error && deviceModel) {
        //配网成功
        [TuyaDevice internal].configNetResult(@"1");
    }
    if (error) {
        //配网失败
        [TuyaDevice internal].configNetResult(@"0");
    }
}


@end
